﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Model;
using Model.Models;
using Persistence;
namespace Services
{
    /// <summary>
    /// Gerencia todas as regras de negócio da entidade Subproduto
    /// </summary>
    public class GerenciadorSubproduto
    {
        private IUnitOfWork unitOfWork;
        private bool shared;

        public GerenciadorSubproduto()
        {
            this.unitOfWork = new UnitOfWork();
            shared = false;
        }

        internal GerenciadorSubproduto(IUnitOfWork unitOfword)
        {
            this.unitOfWork = unitOfword;
            shared = true;
        }

        public int Inserir(SubprodutoModel subprodutoModel)
        {
            TB_SUBPRODUTO subprodutoE = new TB_SUBPRODUTO();
            Atribuir(subprodutoModel, subprodutoE);
            unitOfWork.RepositorioSubproduto.Inserir(subprodutoE);
            unitOfWork.Commit(shared);
            return subprodutoE.id_subproduto;

        }


        public void Editar(SubprodutoModel subprodutoModel)
        {
            TB_SUBPRODUTO subprodutoE = new TB_SUBPRODUTO();
            Atribuir(subprodutoModel, subprodutoE);
            unitOfWork.RepositorioSubproduto.Editar(subprodutoE);
            unitOfWork.Commit(shared);
        }

        public void Remover(int idSubproduto)
        {
            unitOfWork.RepositorioSubproduto.Remover(subproduto => subproduto.id_subproduto.Equals(idSubproduto));
            unitOfWork.Commit(shared);

        }

        private IQueryable<SubprodutoModel> GetQuery()
        {
            IQueryable<TB_SUBPRODUTO> tb_subproduto = unitOfWork.RepositorioSubproduto.GetQueryable();
            var query = from subproduto in tb_subproduto orderby(subproduto.descricao)
                        select new SubprodutoModel
                        {
                            Id_Subproduto = subproduto.id_subproduto,
                            Id_Empresa = subproduto.id_empresa,
                            Descricao = subproduto.descricao,
                            NomeEmpresa = subproduto.TB_EMPRESA.nome
                        };
            return query;
        }

        public IQueryable<SubprodutoModel> ObterTodosByEmpresa(int id_empresa)
        {
            return GetQuery().Where(subproduto => subproduto.Id_Empresa.Equals(id_empresa));
        }


        public IEnumerable<SubprodutoModel> ObterTodos()
        {
            return GetQuery();
        }

        public SubprodutoModel Obter(int idSubproduto)
        {
            IEnumerable<SubprodutoModel> subprodutoEs = GetQuery().Where(subprodutoModel => subprodutoModel.Id_Subproduto.Equals(idSubproduto));
            return subprodutoEs.ElementAtOrDefault(0);
        }


        private void Atribuir(SubprodutoModel subprodutoModel, TB_SUBPRODUTO subprodutoE)
        {
            subprodutoE.id_subproduto = subprodutoModel.Id_Subproduto;
            subprodutoE.id_empresa = subprodutoModel.Id_Empresa;
            subprodutoE.descricao = subprodutoModel.Descricao;
        }
    }
}